package cn.mesmile.excel.entity;

import cn.mesmile.excel.enums.GenderEnum;
import cn.mesmile.excel.enums.UserStateEnum;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

/**
 * @author zb
 * @date 2020/3/8 23:10
 * @Description:  AR 模式  ① 实体类继承 Model   ② 继承 BaseMapper
 */
@Data
@TableName("user")
public class User extends Model<User> {

    /**
     *  IdType.AUTO  数据库ID自增
     *  IdType.NONE  该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
     *  IdType.INPUT 用户输入ID   <p>该类型可以通过自己注册自动填充插件进行填充</p>
     */

    /** 以下2种类型、只有当插入对象ID 为空，才自动填充。
    *     ASSIGN_ID    雪花算法    主键类型为number或string
    *     ASSIGN_UUID  UUID        string
    *     局部策略 优于  全局策略
    *  @TableId   指定主键，若没有 @TableId 指定主键，则默认找到名字叫 id 为主键
    * */

    @ExcelProperty("id")
    @TableId(type= IdType.NONE)
    private Long id;

    /**
     *  insertStrategy = FieldStrategy.NOT_NULL
     *  配置策略，插入数据的时候，不为空，若为空则不会出现该字段
     *
     *  condition = SqlCondition.LIKE
     *  实体查询条件，用于实体作为查询条件
     */
    @ExcelProperty("姓名")
    @TableField(condition = SqlCondition.LIKE,insertStrategy = FieldStrategy.NOT_NULL)
    private String name;

    /**
     * name 指定 字段的名字
     */
    @ExcelProperty("年龄")
    @TableField(value = "age")
    private Integer age;

    @ExcelProperty("邮箱")
    private String email;


    @ExcelProperty("生日")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
    private Date birthday;

    @ExcelIgnore
    @TableField(value = "group_name")
    private String groupName;

    @ExcelIgnore
    // 逻辑删除的 局部设置
    @TableField(select = false) // 查询的时候，不显示这个参数
    @TableLogic
    private Integer deleted;

    @ExcelIgnore
    // 静态字段不会持久化到数据库
    private static String remark;


    public static String getRemark() {
        return remark;
    }

    public static void setRemark(String remark) {
        User.remark = remark;
    }

    @ExcelIgnore
    // 不会持久化到数据
    @JsonIgnore
    @TableField(exist = false)
    private String ingest;

    @ExcelIgnore
    @Version
    private Integer version;

    /**
     *  这里用枚举来表示性别
     *  {@link GenderEnum}
     *
     */
    @ExcelIgnore
    private GenderEnum gender;
    /**
     * 用户状态
     */
    @ExcelIgnore
    private UserStateEnum state;

    /**
     *  创建时间
     */
    @ExcelIgnore
    private Date createTime;

    /**
     *  修改时间
     */
    @ExcelIgnore
    private Date updateTime;

}
